home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1999 August / SGI Freeware 1999 August.iso / dist / fw_HDF.idb / usr / freeware / include / hdf / mfhdf.h.z / mfhdf.h
Encoding:
C/C++ Source or Header  |  1999-01-26  |  19.5 KB  |  547 lines

  1. /****************************************************************************
  2.  * NCSA HDF                                                                 *
  3.  * Software Development Group                                               *
  4.  * National Center for Supercomputing Applications                          *
  5.  * University of Illinois at Urbana-Champaign                               *
  6.  * 605 E. Springfield, Champaign IL 61820                                   *
  7.  *                                                                          *
  8.  * For conditions of distribution and use, see the accompanying             *
  9.  * hdf/COPYING file.                                                        *
  10.  *                                                                          *
  11.  ****************************************************************************/
  12.  
  13. /* $Id: mfhdf.h,v 1.36 1998/01/14 22:58:26 epourmal Exp $ */
  14.  
  15. #ifndef _MFSD_H_
  16. #define _MFSD_H_
  17.  
  18. #ifndef HDF
  19. #define HDF 1
  20. #endif
  21.  
  22. /* change this back if it causes problems on other machines than the Alhpa-QAK */
  23. /* Reverse back to the previous way. AKC */
  24. #include "hdf.h"
  25. #include "netcdf.h"
  26. #ifdef OLD_WAY
  27. #include "local_nc.h"
  28. #endif /* OLD_WAY */
  29.  
  30. #define SD_UNLIMITED NC_UNLIMITED /* use this as marker for unlimited dimension */
  31. #define SD_NOFILL    NC_NOFILL
  32. #define SD_FILL      NC_FILL
  33. #define SD_DIMVAL_BW_COMP   1
  34. #define SD_DIMVAL_BW_INCOMP  0
  35. #define SD_RAGGED    -1  /* marker for ragged dimension */
  36.  
  37. #ifdef __cplusplus
  38. extern "C" {
  39. #endif
  40.  
  41. extern int32 SDstart
  42.     (const char *name, int32 access);
  43.  
  44. extern intn SDend
  45.     (int32 fid);
  46.  
  47. extern intn SDfileinfo
  48.     (int32 fid, int32 *datasets, int32 *attrs);
  49.  
  50. extern int32 SDselect
  51.     (int32 fid, int32 index);
  52.  
  53. extern intn SDgetinfo
  54.     (int32 sdsid, char *name, int32 *rank, int32 *dimsizes, 
  55.            int32 *nt, int32 *nattr);
  56.  
  57. #ifndef __CSTAR__
  58. extern intn SDreaddata
  59.     (int32 sdsid, int32 *start, int32 *stride, int32 *end, void * data);
  60. #endif
  61.  
  62. extern uint16 SDgerefnumber
  63.     (int32 sdsid);
  64.  
  65. extern int32 SDnametoindex
  66.     (int32 fid, const char *name);
  67.  
  68. extern intn SDgetrange
  69.     (int32 sdsid, void * pmax, void * pmin);
  70.  
  71. extern int32 SDcreate
  72.     (int32 fid, const char *name, int32 nt, int32 rank, int32 *dimsizes);
  73.  
  74. extern int32 SDgetdimid
  75.     (int32 sdsid, intn number);
  76.  
  77. extern intn SDsetdimname
  78.     (int32 id, const char *name);
  79.  
  80. extern intn SDendaccess
  81.     (int32 id);
  82.  
  83. extern intn SDsetrange
  84.     (int32 sdsid, void * pmax, void * pmin);
  85.  
  86. extern intn SDsetattr
  87.     (int32 id, const char *name, int32 nt, int32 count, const void * data);
  88.  
  89. extern intn SDattrinfo
  90.     (int32 id, int32 index, char *name, int32 *nt, int32 *count);
  91.  
  92. extern intn SDreadattr
  93.     (int32 id, int32 index, void * buf);
  94.  
  95. #ifndef __CSTAR__
  96. extern intn SDwritedata
  97.     (int32 sdsid, int32 *start, int32 *stride, int32 *end, void * data);
  98. #endif
  99.  
  100. extern intn SDsetdatastrs
  101.     (int32 sdsid, const char *l, const char *u, const char *f, const char *c);
  102.  
  103. extern intn SDsetcal
  104.     (int32 sdsid, float64 cal, float64 cale, float64 ioff,
  105.                float64 ioffe, int32 nt);
  106.  
  107. extern intn SDsetfillvalue
  108.     (int32 sdsid, void * val);
  109.  
  110. extern intn SDgetfillvalue
  111.     (int32 sdsid, void * val);
  112.  
  113. extern intn SDsetfillmode
  114.     (int32 id, intn fillmode);
  115.  
  116. extern intn SDgetdatastrs
  117.     (int32 sdsid, char *l, char *u, char *f, char *c, intn len);
  118.  
  119. extern intn SDgetcal
  120.     (int32 sdsid, float64 *cal, float64 *cale, float64 *ioff, 
  121.                float64 *ioffe, int32 *nt);
  122.  
  123. extern intn SDsetdimstrs
  124.     (int32 id, const char *l, const char *u, const char *f);
  125.  
  126. extern intn SDsetdimscale
  127.     (int32 id, int32 count, int32 nt, void * data);
  128.  
  129. extern intn SDgetdimscale
  130.     (int32 id, void * data);
  131.  
  132. extern intn SDdiminfo
  133.     (int32 id, char *name, int32 *size, int32 *nt, int32 *nattr);
  134.  
  135. extern intn SDgetdimstrs
  136.     (int32 id, char *l, char *u, char *f, intn len);
  137.  
  138. extern intn SDsetexternalfile
  139.     (int32 id, const char *filename, int32 offset);
  140.  
  141. extern intn SDsetnbitdataset
  142.     (int32 id, intn start_bit, intn bit_len, intn sign_ext, intn fill_one);
  143.  
  144. extern intn SDsetcompress
  145.     (int32 id, int32 type, comp_info *c_info);
  146.  
  147. extern int32 SDfindattr
  148.     (int32 id, const char *attrname);
  149.  
  150. extern int32 SDidtoref
  151.     (int32 id);
  152.  
  153. extern int32 SDreftoindex
  154.     (int32 fid, int32 ref);
  155.  
  156. extern int32 SDisrecord
  157.     (int32 id);
  158.  
  159. extern intn SDiscoordvar
  160.     (int32 id);
  161.  
  162. extern intn SDsetaccesstype
  163.     (int32 id, uintn accesstype);
  164.  
  165. extern intn SDsetblocksize
  166.     (int32 sdsid, int32 block_size);
  167.  
  168. extern intn SDsetdimval_comp
  169.     (int32 dimid, intn compt_mode);
  170.  
  171. extern intn SDisdimval_bwcomp
  172.     (int32 dimid);
  173.  
  174. /*====================== Chunking Routines ================================*/
  175.  
  176. /* For defintion of HDF_CHUNK_DEF union see hproto.h since 
  177.    this defintion is also used by GRs. */
  178.  
  179. /******************************************************************************
  180.  NAME
  181.       SDsetchunk   -- make SDS a chunked SDS
  182.  
  183.  DESCRIPTION
  184.       This routine makes the SDS a chunked SDS according to the chunk
  185.       definition passed in.
  186.  
  187.       The dataset currently cannot be special already.  i.e. NBIT,
  188.       COMPRESSED, or EXTERNAL. This is an Error.
  189.  
  190.       The defintion of the HDF_CHUNK_DEF union with relvant fields is:
  191.  
  192.       typedef union hdf_chunk_def_u
  193.       {
  194.          int32   chunk_lengths[MAX_VAR_DIMS];  Chunk lengths along each dimension
  195.  
  196.          struct 
  197.           {   
  198.             int32     chunk_lengths[MAX_VAR_DIMS]; Chunk lengths along each dimension
  199.             int32     comp_type;                   Compression type 
  200.             comp_info cinfo;                       Compression info struct 
  201.           }comp;
  202.  
  203.       } HDF_CHUNK_DEF
  204.  
  205.       The simplist is the 'chunk_lengths' array specifiying chunk 
  206.       lengths for each dimension where the 'flags' argument set to 
  207.       'HDF_CHUNK';
  208.  
  209.       COMPRESSION is set by using the 'HDF_CHUNK_DEF' structure to set the
  210.       appropriate compression information along with the required chunk lengths
  211.       for each dimension. The compression information is the same as 
  212.       that set in 'SDsetcompress()'. The bit-or'd'flags' argument' is set to 
  213.       'HDF_CHUNK | HDF_COMP'.
  214.  
  215.       See the example in pseudo-C below for further usage.
  216.  
  217.       The maximum number of Chunks in an HDF file is 65,535.
  218.  
  219.       The dataset currently cannot have an UNLIMITED dimension.
  220.  
  221.       The performance of the SDxxx interface with chunking is greatly
  222.       affected by the users access pattern over the dataset and by
  223.       the maximum number of chunks set in the chunk cache. The cache contains 
  224.       the Least Recently Used(LRU cache replacment policy) chunks. See the
  225.       routine SDsetchunkcache() for further info on the chunk cache and how 
  226.       to set the maximum number of chunks in the chunk cache. A default chunk 
  227.       cache is always created.
  228.  
  229.       The following example shows the organization of chunks for a 2D array.
  230.       e.g. 4x4 array with 2x2 chunks. The array shows the layout of
  231.            chunks in the chunk array.
  232.  
  233.             4 ---------------------                                           
  234.               |         |         |                                                 
  235.         Y     |  (0,1)  |  (1,1)  |                                       
  236.         ^     |         |         |                                      
  237.         |   2 ---------------------                                       
  238.         |     |         |         |                                               
  239.         |     |  (0,0)  |  (1,0)  |                                      
  240.         |     |         |         |                                           
  241.         |     ---------------------                                         
  242.         |     0         2         4                                       
  243.         ---------------> X                                                       
  244.                                                                                 
  245.         --Without compression--:
  246.         {                                                                    
  247.         HDF_CHUNK_DEF chunk_def;
  248.                                                                             
  249.         .......                                                                    
  250.         -- Set chunk lengths --                                                    
  251.         chunk_def.chunk_lengths[0]= 2;                                                     
  252.         chunk_def.chunk_lengths[1]= 2; 
  253.  
  254.         -- Set Chunking -- 
  255.         SDsetchunk(sdsid, chunk_def, HDF_CHUNK);                      
  256.          ......                                                                  
  257.         }                                                                           
  258.  
  259.         --With compression--:
  260.         {                                                                    
  261.         HDF_CHUNK_DEF chunk_def;
  262.                                                                             
  263.         .......                
  264.         -- Set chunk lengths first --                                                    
  265.         chunk_def.chunk_lengths[0]= 2;                                                     
  266.         chunk_def.chunk_lengths[1]= 2;
  267.  
  268.         -- Set compression --
  269.         chunk_def.comp.cinfo.deflate.level = 9;
  270.         chunk_def.comp.comp_type = COMP_CODE_DEFLATE;
  271.  
  272.         -- Set Chunking with Compression --
  273.         SDsetchunk(sdsid, chunk_def, HDF_CHUNK | HDF_COMP);                      
  274.          ......                                                                  
  275.         }                                                                           
  276.  
  277.  RETURNS
  278.         SUCCEED/FAIL
  279. ******************************************************************************/
  280. extern intn SDsetchunk
  281.     (int32 sdsid,             /* IN: sds access id */
  282.      HDF_CHUNK_DEF chunk_def, /* IN: chunk definition */
  283.      int32 flags              /* IN: flags */);
  284.  
  285. /******************************************************************************
  286.  NAME
  287.      SDgetchunkinfo -- get Info on SDS
  288.  
  289.  DESCRIPTION
  290.      This routine gets any special information on the SDS. If its chunked,
  291.      chunked and compressed or just a regular SDS. Currently it will only
  292.      fill the array of chunk lengths for each dimension as specified in
  293.      the 'HDF_CHUNK_DEF' union. It does not tell you the type of compression
  294.      used or the compression parameters. You can pass in a NULL for 'chunk_def'
  295.      if don't want the chunk lengths for each dimension.
  296.      Additionaly if successfull it will return a bit-or'd value in 'flags' 
  297.      indicating if the SDS is:
  298.  
  299.      Chunked                  -> flags = HDF_CHUNK
  300.      Chunked and compressed   -> flags = HDF_CHUNK | HDF_COMP 
  301.      Non-chunked              -> flags = HDF_NONE
  302.   
  303.      e.g. 4x4 array - Pseudo-C
  304.      {
  305.      int32   rcdims[3];
  306.      HDF_CHUNK_DEF rchunk_def;
  307.      int32   cflags;
  308.      ...
  309.      rchunk_def.chunk_lengths = rcdims;
  310.      SDgetchunkinfo(sdsid, &rchunk_def, &cflags);
  311.      ...
  312.      }
  313.  
  314.  RETURNS
  315.         SUCCEED/FAIL
  316. ******************************************************************************/
  317. extern intn SDgetchunkinfo
  318.     (int32 sdsid,              /* IN: sds access id */
  319.      HDF_CHUNK_DEF *chunk_def, /* IN/OUT: chunk definition */
  320.      int32 *flags              /* IN/OUT: flags */);
  321.  
  322. /******************************************************************************
  323.  NAME
  324.      SDwritechunk  -- write the specified chunk to the SDS
  325.  
  326.  DESCRIPTION
  327.      This routine writes a whole chunk of data to the chunked SDS 
  328.      specified by chunk 'origin' for the given SDS and can be used
  329.      instead of SDwritedata() when this information is known. This
  330.      routine has less overhead and is much faster than using SDwritedata().
  331.  
  332.      Origin specifies the co-ordinates of the chunk according to the chunk
  333.      position in the overall chunk array.
  334.  
  335.      'datap' must point to a whole chunk of data.
  336.  
  337.      See SDsetchunk() for a description of the organization of chunks in an SDS.
  338.  
  339.  RETURNS
  340.         SUCCEED/FAIL
  341. ******************************************************************************/
  342. extern intn SDwritechunk
  343.     (int32 sdsid,      /* IN: sds access id */
  344.      int32 *origin,    /* IN: origin of chunk to write */
  345.      const void *datap /* IN: buffer for data */);
  346.  
  347. /******************************************************************************
  348.  NAME
  349.      SDreadchunk   -- read the specified chunk to the SDS
  350.  
  351.  DESCRIPTION
  352.      This routine reads a whole chunk of data from the chunked SDS
  353.      specified by chunk 'origin' for the given SDS and can be used
  354.      instead of SDreaddata() when this information is known. This
  355.      routine has less overhead and is much faster than using SDreaddata().
  356.  
  357.      Origin specifies the co-ordinates of the chunk according to the chunk
  358.      position in the overall chunk array.
  359.  
  360.      'datap' must point to a whole chunk of data.
  361.  
  362.      See SDsetchunk() for a description of the organization of chunks in an SDS.
  363.  
  364.  RETURNS
  365.         SUCCEED/FAIL
  366. ******************************************************************************/
  367. extern intn SDreadchunk
  368.     (int32 sdsid,      /* IN: sds access id */
  369.      int32 *origin,    /* IN: origin of chunk to read */
  370.      void  *datap      /* IN/OUT: buffer for data */);
  371.  
  372. /******************************************************************************
  373. NAME
  374.      SDsetchunkcache -- maximum number of chunks to cache 
  375.  
  376. DESCRIPTION
  377.      Set the maximum number of chunks to cache.
  378.  
  379.      The cache contains the Least Recently Used(LRU cache replacment policy) 
  380.      chunks. This routine allows the setting of maximum number of chunks that 
  381.      can be cached, 'maxcache'.
  382.  
  383.      The performance of the SDxxx interface with chunking is greatly
  384.      affected by the users access pattern over the dataset and by
  385.      the maximum number of chunks set in the chunk cache. The number chunks 
  386.      that can be set in the cache is process memory limited. It is a good 
  387.      idea to always set the maximum number of chunks in the cache as the 
  388.      default heuristic does not take into account the memory available for 
  389.      the application.
  390.  
  391.      By default when the SDS is promoted to a chunked element the 
  392.      maximum number of chunks in the cache 'maxcache' is set to the number of
  393.      chunks along the last dimension.
  394.  
  395.      The values set here affects the current object's caching behaviour.
  396.  
  397.      If the chunk cache is full and 'maxcache' is greater then the
  398.      current 'maxcache' value, then the chunk cache is reset to the new
  399.      'maxcache' value, else the chunk cache remains at the current
  400.      'maxcache' value.
  401.  
  402.      If the chunk cache is not full, then the chunk cache is set to the
  403.      new 'maxcache' value only if the new 'maxcache' value is greater than the
  404.      current number of chunks in the cache.
  405.  
  406.      Use flags argument of 'HDF_CACHEALL' if the whole object is to be cached 
  407.      in memory, otherwise pass in zero(0). Currently you can only
  408.      pass in zero.
  409.  
  410.     See SDsetchunk() for a description of the organization of chunks in an SDS.
  411.  
  412. RETURNS
  413.      Returns the 'maxcache' value for the chunk cache if successful 
  414.      and FAIL otherwise
  415. ******************************************************************************/
  416. extern intn SDsetchunkcache
  417.     (int32 sdsid,     /* IN: sds access id */
  418.      int32 maxcache,  /* IN: max number of chunks to cache */
  419.      int32 flags      /* IN: flags = 0, HDF_CACHEALL */);
  420.  
  421. /* Define the FORTRAN names */
  422.  
  423. #ifndef MFSD_FNAMES
  424. #   define  MFSD_FNAMES
  425. #ifdef DF_CAPFNAMES
  426. #   define nscstart    FNAME(SCSTART)
  427. #   define nsfend      FNAME(SFEND)
  428. #   define nsfendacc   FNAME(SFENDACC)
  429. #   define nsffinfo    FNAME(SFFINFO)
  430. #   define nsfselect   FNAME(SFSELECT)
  431. #   define nscginfo    FNAME(SCGINFO)
  432. #   define nscgainfo   FNAME(SCGAINFO)
  433. #   define nscgdinfo   FNAME(SCGDINFO)
  434. #   define nsfgcal     FNAME(SFGCAL)
  435. #   define nsfscal     FNAME(SFSCAL)
  436. #   define nsfgdscale  FNAME(SFGDSCALE)
  437. #   define nsfsdscale  FNAME(SFSDSCALE)
  438. #   define nsfgcfill   FNAME(SFGCFILL)
  439. #   define nsfgfill    FNAME(SFGFILL)
  440. #   define nsfscfill   FNAME(SFSCFILL)
  441. #   define nsfsfill    FNAME(SFSFILL)
  442. #   define nsfsflmd    FNAME(SFSFLMD)
  443. #   define nsfgrange   FNAME(SFGRANGE)
  444. #   define nsfsrange   FNAME(SFSRANGE)
  445. #   define nscn2index  FNAME(SCN2INDEX)
  446. #   define nsccreate   FNAME(SCCREATE)
  447. #   define nscsdimstr  FNAME(SCSDIMSTR)
  448. #   define nscsdimname FNAME(SCSDIMNAME)
  449. #   define nscsdatstr  FNAME(SCSDATSTR)
  450. #   define nsfdimid    FNAME(SFDIMID)
  451. #   define nsfrcatt    FNAME(SFRCATT)
  452. #   define nsfrnatt    FNAME(SFRNATT)
  453. #   define nsfrattr    FNAME(SFRATTR)
  454. #   define nsfrcdata   FNAME(SFRCDATA)
  455. #   define nsfrdata    FNAME(SFRDATA)
  456. #   define nsfwcdata   FNAME(SFWCDATA)
  457. #   define nsfwdata    FNAME(SFWDATA)
  458. #   define nscgdatstrs FNAME(SCGDATSTRS)
  459. #   define nscgdimstrs FNAME(SCGDIMSTRS)
  460. #   define nscscatt    FNAME(SCSCATT)
  461. #   define nscsnatt    FNAME(SCSNATT)
  462. #   define nscsattr    FNAME(SCSATTR)
  463. #   define nscfattr    FNAME(SCFATTR)
  464. #   define nsfid2ref  FNAME(SFID2REF)
  465. #   define nsfref2index FNAME(SFREF2INDEX)
  466. #   define nsfiscvar   FNAME(SFISCVAR)
  467. #   define nscsextf    FNAME(SCSEXTF)
  468. #   define nsfsacct    FNAME(SFSACCT)
  469. #   define nsfsdmvc    FNAME(SFSDMVC)
  470. #   define nsfisdmvc   FNAME(SFISDMVC)
  471. #   define nsfisrcrd     FNAME(SFISRCRD)
  472. #   define nscgichnk     FNAME(SCGICHNK)
  473. #   define nscrcchnk     FNAME(SCRCCHNK)
  474. #   define nscrchnk      FNAME(SCRCHNK)
  475. #   define nscscchnk     FNAME(SCSCCHNK)
  476. #   define nscschnk      FNAME(SCSCHNK)
  477. #   define nscwcchnk     FNAME(SCWCCHNK) 
  478. #   define nscwchnk      FNAME(SCWCHNK)
  479. #   define nscscompress  FNAME(SCSCOMPRESS)
  480. #   define nsfsnbit      FNAME(SFSNBIT)
  481. #   define nsfsblsz      FNAME(SFSBLSZ)
  482. #else   /* DF_CAPFNAMES */
  483. #   define nscstart    FNAME(scstart)
  484. #   define nsfend      FNAME(sfend)
  485. #   define nsfendacc   FNAME(sfendacc)
  486. #   define nsffinfo    FNAME(sffinfo)
  487. #   define nsfselect   FNAME(sfselect)
  488. #   define nscginfo    FNAME(scginfo)
  489. #   define nscgainfo   FNAME(scgainfo)
  490. #   define nscgdinfo   FNAME(scgdinfo)
  491. #   define nsfgcal     FNAME(sfgcal)
  492. #   define nsfscal     FNAME(sfscal)
  493. #   define nsfgdscale  FNAME(sfgdscale)
  494. #   define nsfsdscale  FNAME(sfsdscale)
  495. #   define nsfgcfill   FNAME(sfgcfill)
  496. #   define nsfgfill    FNAME(sfgfill)
  497. #   define nsfscfill   FNAME(sfscfill)
  498. #   define nsfsfill    FNAME(sfsfill)
  499. #   define nsfsflmd    FNAME(sfsflmd)
  500. #   define nsfgrange   FNAME(sfgrange)
  501. #   define nsfsrange   FNAME(sfsrange)
  502. #   define nscn2index  FNAME(scn2index)
  503. #   define nsccreate   FNAME(sccreate)
  504. #   define nscsdimstr  FNAME(scsdimstr)
  505. #   define nscsdimname FNAME(scsdimname)
  506. #   define nscsdatstr  FNAME(scsdatstr)
  507. #   define nsfdimid    FNAME(sfdimid)
  508. #   define nsfrcatt    FNAME(sfrcatt)
  509. #   define nsfrnatt    FNAME(sfrnatt)
  510. #   define nsfrattr    FNAME(sfrattr)
  511. #   define nscscatt    FNAME(scscatt)
  512. #   define nscsnatt    FNAME(scsnatt)
  513. #   define nscsattr    FNAME(scsattr)
  514. #   define nscfattr    FNAME(scfattr)
  515. #   define nsfrcdata   FNAME(sfrcdata)
  516. #   define nsfrdata    FNAME(sfrdata)
  517. #   define nsfwcdata   FNAME(sfwcdata)
  518. #   define nsfwdata    FNAME(sfwdata)
  519. #   define nscgdatstrs FNAME(scgdatstrs)
  520. #   define nscgdimstrs FNAME(scgdimstrs)
  521. #   define nsfid2ref   FNAME(sfid2ref)
  522. #   define nsfref2index FNAME(sfref2index)
  523. #   define nsfiscvar   FNAME(sfiscvar)
  524. #   define nscsextf    FNAME(scsextf)
  525. #   define nsfsacct    FNAME(sfsacct)
  526. #   define nsfsdmvc    FNAME(sfsdmvc)
  527. #   define nsfisdmvc   FNAME(sfisdmvc)
  528. #   define nsfisrcrd     FNAME(sfisrcrd)
  529. #   define nscgichnk     FNAME(scgichnk)
  530. #   define nscrcchnk     FNAME(scrcchnk)
  531. #   define nscrchnk      FNAME(scrchnk)
  532. #   define nscscchnk     FNAME(scscchnk)
  533. #   define nscschnk      FNAME(scschnk)
  534. #   define nscwcchnk     FNAME(scwcchnk) 
  535. #   define nscwchnk      FNAME(scwchnk)
  536. #   define nscscompress  FNAME(scscompress)
  537. #   define nsfsnbit      FNAME(sfsnbit)
  538. #   define nsfsblsz      FNAME(sfsblsz)
  539. #endif
  540. #endif
  541.  
  542. #ifdef __cplusplus
  543. }
  544. #endif
  545.  
  546. #endif /* _MFSD_H_ */
  547.